package com.wanyangproject.androidlearning.designMode.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {

    public static void main(String[] args){
        /*
         *
         * 静态代理：代理类与代理对象都实现同一个接口或继承自同一个类，不对代理对象进行直接修改。而通过组合方式使得代理类拥有代理对象的引用，以实现功能的附加或增强。
         * */
        Bird bird = new Bird();
        BirdProxy proxy = new BirdProxy(bird);
        proxy.fly();


        /*
        * 动态代理
        *对有多个实现了同一接口的类或同一个接口，通过反射动态产生一个实例对象。
        * 假如需要代理的接口对象过多，则可以用动态代理，可大大减轻工作量，提高效率。如retrofit
        * */
        System.out.println();
        System.out.println("------------------");
        InvocationHandler handler = new BirdDynamic(bird);
        Fly fly = (Fly) Proxy.newProxyInstance(Bird.class.getClassLoader(),Bird.class.getInterfaces(),handler);
        fly.fly();

    }


}
